class LRUCache {
  constructor(capacity) {
    this.capacity = capacity;  // 缓存容量
    this.map = new Map();  // 使用Map来存储缓存数据，实现O(1)的查找和删除
  }
  
  get(key) {
    const value = this.map.get(key);  // 查找缓存数据
    if (value === undefined) {  // 如果数据不存在，返回-1
      return -1;
    } else {  // 如果数据存在，将其从Map中删除并重新插入到Map的最后面
      this.map.delete(key);
      this.map.set(key, value);
      return value;
    }
  }
  
  put(key, value) {
    if (this.map.has(key)) {  // 如果缓存数据已存在，将其从Map中删除
      this.map.delete(key);
    }
    this.map.set(key, value);  // 插入新的缓存数据到Map的最后面
    if (this.map.size > this.capacity) {  // 如果缓存容量已满，删除最近最少使用的缓存数据
      const oldestKey = this.map.keys().next().value;  // 获取Map中第一个键，即最近最少使用的缓存数据的键
      this.map.delete(oldestKey);
    }
  }
}

// 示例
const cache = new LRUCache(2);  // 初始化容量为2的LRU缓存
cache.put(1, 1);
cache.put(2, 2);
console.log(cache.get(1));  // 1，因为缓存中存在键为1的数据
cache.put(3, 3);  // 缓存容量已满，删除最近最少使用的缓存数据（键为2的数据）
console.log(cache.get(2));  // -1，因为缓存中不存在键为2的数据
cache.put(4, 4);  // 缓存容量已满，删除最近最少使用的缓存数据（键为1的数据）
console.log(cache.get(1));  // -1，因为缓存中不存在键为1的数据
console.log(cache.get(3));  // 3，因为缓存中存在键为3的数据
console.log(cache.get(4));  // 4，因为缓存中存在键为4的数据
